/*
 * mainTask.h
 *
 *  Created on: Jun 5, 2021
 *      Author: soliber
 */

#ifndef TASKS_MAINTASK_H_
#define TASKS_MAINTASK_H_

#include "stm32f1xx_hal.h"


/*
 * @brief 设备类型
 */
enum device
{
    HELMET,	//定位头盔
    ANCHOR,	//定位基站
    REF		//气压参考站
};

/*
 * @brief   节点状态
 * @note    以下状态仅适用于定位头盔设备
 */
enum status
{
	INIT,	//初始化状态：设备刚刚启动或复位
	SAFE,	//安全状态：没有发生危险，正常采集电压、气压、位置并上报，救援模块掉电
	ALARM,	//报警状态：可能发生了危险，持续上报报警事件，电压、气压、位置信息正常采集上报
	RESCUE,	//救援状态：服务器确认人员发生了危险，救援模块上电，其他功能模块均掉电或休眠
	LOST	//失联状态：DTU失去网络连接，停止数据上报，直到网络连接恢复
};


//-----------------------------------------------------------------------
/*
 * @brief	modbus寄存器映射
 */

/*
 * 设备信息寄存器
 */
struct dev_info_regs
{
    uint16_t fw_version;	//固件版本
    uint16_t device_id;		//设备ID
    uint16_t device_type;	//设备类型，0=头盔(UWB tag)，1=基站(UWB anchor)，2=气压基准(UWB off)
    uint16_t save;			//保存配置到FLASH，1=保存，2=重启，3=保存并重启，该寄存器自动清零
};

/*
 * 电压采集配置寄存器
 */
struct volt_conf_regs
{
    uint16_t period_ms;	//电压采样周期(ms)
    uint16_t filter_N;	//均值滤波点数，每采集到filter个样本点后计算均值，更新到寄存器中
    uint16_t min_mV;	//电压报警阈值(mv)
    uint16_t reserved1;
};

/*
 * 气压采集配置寄存器
 */
struct pres_conf_regs
{
    uint16_t period_ms;	//气压采样周期(ms)
    uint16_t filter_N;	//均值滤波长度，每采集到filter个样本点后计算均值，更新到寄存器中
    uint32_t max_Pa;	//气压报警阈值(Pa)
    uint16_t reserved1;
    uint16_t reserved2;
};

/*
 * 测距配置寄存器
 */
struct range_conf_regs
{
    uint16_t period_ms;	//UWB测距周期(ms)
    uint16_t mode;		//UWB测距信道模式
    uint16_t id;		//UWB测距本机ID
    uint16_t max_keep_s;//结果最大保持时间（s），超过该时间的测距结果将被清除
    uint16_t reserved2;
    uint16_t reserved3;
};

/*
 * 设备状态寄存器
 */
struct dev_status_regs
{
	uint16_t pre_status;	//上一状态，0=初始化，1=安全，2=报警，3=救援，4=失联
	uint16_t cur_status;	//当前状态，0=初始化，1=安全，2=报警，3=救援，4=失联
	uint16_t nex_status;	//下一状态，0=初始化，1=安全，2=报警，3=救援，4=失联
	uint16_t reserved1;
};

/*
 * 电压采集结果寄存器
 */
struct volt_rslt_regs
{
    uint16_t cur_mV;	//当前电压(mv)
    uint16_t reserved1;
};

/*
 * 气压采集结果寄存器
 */
struct pres_rslt_regs
{
    uint32_t cur_Pa;	//当前气压(Pa)
    int32_t	 cur_10mC;	//当前气温(0.01℃)
};

/*
 * UWB测距结果寄存器
 */
struct range_rslt_regs
{
    uint16_t dist_cm;		//测量到的tag-anchor间距离(cm)
    uint16_t anchor_id;		//anchor的编号
    uint16_t keep_s;		//保持时间(s)，表示该数据是多少秒之前采集到的
    uint16_t reserved1;
};

/*
 * 完整的modbus寄存器映射
 */
#define RANGE_RSLT_LEN		(5)
struct modbus_registers_map
{
	struct dev_info_regs 	dev_info;			//设备信息寄存器组
	struct volt_conf_regs 	volt_conf;			//电压采集配置寄存器组
	struct pres_conf_regs 	pres_conf;			//气压采集配置寄存器组
	struct range_conf_regs 	range_conf;			//测距配置寄存器组

	struct dev_status_regs	dev_stat;			//设备状态寄存器组
	struct volt_rslt_regs 	volt_rslt;			//电压采集结果寄存器组
	struct pres_rslt_regs 	pres_rslt;			//气压采集结果寄存器组
	struct range_rslt_regs 	range_rslt[RANGE_RSLT_LEN];	//测距结果寄存器组
};




//-----------------------------------------------------------------------
/*
 * @brief	保存在FLASH中的设备非易失性配置
 */
struct flash_conf
{
	struct dev_info_regs 	dev_info;			//设备信息寄存器组
	struct volt_conf_regs 	volt_conf;			//电压采集配置寄存器组
	struct pres_conf_regs 	pres_conf;			//气压采集配置寄存器组
	struct range_conf_regs 	range_conf;			//测距配置寄存器组
};

#endif /* TASKS_MAINTASK_H_ */
